package ar.edu.utn.frgp.banco.dao.Implements;

import java.util.List;

import ar.edu.utn.frgp.banco.dao.Interfaces.IntCuenta;
import ar.edu.utn.frgp.banco.dao.connection.ImpConectionHandler;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.sql.ResultSet;

public class ImpCuenta implements IntCuenta {

	@Override
	public void AltaCuenta(Cuenta cuenta) throws DataAccessException {
		PreparedStatement ps = null;
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Insert into Cuentas (id_cliente, tipocuenta, ");
			stringBuilder.append("estado, saldo, descubierto) ");
			stringBuilder.append("VALUES (?,?,?,?,?) ");
			
			ps = cn.prepareStatement(stringBuilder.toString());
			
			ps.setInt(1, cuenta.getID_Cliente());
			ps.setString(2, cuenta.getTipoCuenta());
			ps.setString(3, cuenta.getEstado());
			ps.setDouble(4, cuenta.getSaldo());
			ps.setDouble(5, cuenta.getDescubierto());
			
			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}
	}

	@Override
	public void ModiCuenta(Cuenta cuenta) throws DataAccessException {
		PreparedStatement ps = null;
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("UPDATE Cuentas  set estado = ?, ");
			stringBuilder.append("saldo = ?, descubierto = ? ");
			stringBuilder.append("WHERE id_cuenta = ? ");
			
			ps = cn.prepareStatement(stringBuilder.toString());
			
			ps.setString(1, cuenta.getEstado());
			ps.setDouble(2, cuenta.getSaldo());
			ps.setDouble(3, cuenta.getDescubierto());
			ps.setInt(4, cuenta.getID_Cuenta());
			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}
	}


	public void ActualizarSaldo(Cuenta cuenta, Double saldoNuevo) throws DataAccessException {
		PreparedStatement ps = null;
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("UPDATE Cuentas set saldo = ? ");
			stringBuilder.append("WHERE id_cuenta = ? ");
			
			ps = cn.prepareStatement(stringBuilder.toString());
			
			ps.setDouble(1, saldoNuevo);
			ps.setInt(2, cuenta.getID_Cuenta());
			
			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}
	}
	
	public void ActualizarSaldo(Integer id_cuenta, Double saldoNuevo) throws DataAccessException {
		PreparedStatement ps = null;
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("UPDATE Cuentas set saldo = ? ");
			stringBuilder.append("WHERE id_cuenta = ? ");
			
			ps = cn.prepareStatement(stringBuilder.toString());
			
			ps.setDouble(1, saldoNuevo);
			ps.setInt(2, id_cuenta);
			
			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}
	}

	@Override
	public void BajaCuenta(Cuenta cuenta) throws DataAccessException {
		PreparedStatement ps = null;
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("DELETE Cuentas  ");
			stringBuilder.append("where id_cuenta = ? ");
			
			ps = cn.prepareStatement(stringBuilder.toString());
			
			ps.setInt(1, cuenta.getID_Cuenta());
			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}

	}

	@Override
	public Cuenta TraerCuenta(Integer id_cuenta) throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		Cuenta cu = null;
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_cuenta, id_cliente, tipocuenta, ");
			stringBuilder.append("estado, saldo, descubierto, nrocuenta ");
			stringBuilder.append("from cuentas ");
			stringBuilder.append("WHERE id_cuenta = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, id_cuenta);
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				cu = new Cuenta();
				
				cu.setID_Cuenta(rs.getInt("id_cuenta"));
				cu.setID_Cliente(rs.getInt("id_cliente"));
				cu.setTipoCuenta(rs.getString("tipocuenta"));
				cu.setEstado(rs.getString("estado"));
				cu.setSaldo(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
				cu.setNroCuenta(rs.getInt("nrocuenta"));
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return cu;
	}

	@Override
	public List<Cuenta> TraerCuentas(Integer id_cliente)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		List<Cuenta> Cuentas = new ArrayList<Cuenta>();
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_cuenta, id_cliente, tipocuenta, ");
			stringBuilder.append("estado, saldo, descubierto, nrocuenta ");
			stringBuilder.append("from cuentas ");
			stringBuilder.append("WHERE id_cliente = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, id_cliente);
			
			rs = ps.executeQuery();
			Cuenta cu = null;
			while (rs.next()) {
				cu = new Cuenta();
				
				cu.setID_Cuenta(rs.getInt("id_cuenta"));
				cu.setID_Cliente(rs.getInt("id_cliente"));
				cu.setTipoCuenta(rs.getString("tipocuenta"));
				cu.setEstado(rs.getString("estado"));
				cu.setSaldo(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
				cu.setNroCuenta(rs.getInt("nrocuenta"));
				Cuentas.add(cu);
				
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return Cuentas;
	}

	@Override
	public Cuenta TraerCuentaPorNro(Integer nrocuenta)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		Cuenta cu = null;
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_cuenta, id_cliente, tipocuenta, ");
			stringBuilder.append("estado, saldo, descubierto, nrocuenta ");
			stringBuilder.append("from cuentas ");
			stringBuilder.append("WHERE nrocuenta = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, nrocuenta);
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				cu = new Cuenta();
				
				cu.setID_Cuenta(rs.getInt("id_cuenta"));
				cu.setID_Cliente(rs.getInt("id_cliente"));
				cu.setTipoCuenta(rs.getString("tipocuenta"));
				cu.setEstado(rs.getString("estado"));
				cu.setSaldo(rs.getDouble("saldo"));
				cu.setDescubierto(rs.getDouble("descubierto"));
				cu.setNroCuenta(rs.getInt("nrocuenta"));
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return cu;
	}

}
